package edu.zueb.sport.dao;

import edu.zueb.sport.entity.User;
import java.util.List;
import org.apache.ibatis.annotations.Param;

/**
 * 用户数据访问对象接口
 * 该接口定义了对用户表的基本操作。
 */
public interface UserMapper {

    /**
     * 插入新的用户
     *
     * @param user 要插入的用户对象
     * @return 插入操作影响的行数
     */
    int insertUser(@Param("user") User user);

    /**
     * 根据ID查询用户
     *
     * @param userId 用户的ID
     * @return 查询到的用户对象，如果未找到则返回null
     */
    User getUserById(Integer userId);

    /**
     * 更新用户信息
     *
     * @param user 要更新的用户对象
     * @return 更新操作影响的行数
     */
    int updateUser(@Param("user") User user);

    /**
     * 删除用户
     *
     * @param userId 要删除的用户的ID
     * @return 删除操作影响的行数
     */
    int deleteUser(Integer userId);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户的用户名
     * @return 查询到的用户对象，如果未找到则返回null
     */
    User getByUsername(@Param("username") String username);

    /**
     * 根据条件统计用户总数。
     *
     * @param name     用户姓名
     * @param username 用户名
     * @param userType 用户类型
     * @return 符合条件的用户总数
     */
    int countByPage(@Param("name") String name, @Param("username") String username, @Param("userType") String userType);

    /**
     * 根据条件分页查询用户列表。
     * 该方法支持根据用户姓名、用户名、用户类型进行筛选，并支持分页查询。
     *
     * @param name      用户姓名，支持模糊查询
     * @param username  用户名，支持模糊查询
     * @param userType  用户类型，用于筛选特定类型的用户
     * @param pageNo    当前页码，从1开始
     * @param pageSize  每页大小，用于控制每页返回的用户数量
     * @return 返回符合条件的用户列表，若未找到则返回空列表
     */
    List<User> listByPage(
            @Param("name") String name,
            @Param("username") String username,
            @Param("userType") String userType,
            @Param("pageNo") Integer pageNo,
            @Param("pageSize") Integer pageSize);

    /**
     * 更新用户状态。
     * 将用户状态设置为禁用（userStatus = 0），仅当用户当前状态为启用（1）时执行操作。
     * 如果用户不存在或已是禁用状态，则不会执行更新操作。
     *
     * @param user 包含用户ID和状态信息的用户对象
     * @return 更新操作影响的行数（1=操作成功，0=用户不存在或已是禁用状态）
     */
    int updateStatus(@Param("user") User user);
}
